package com.linkgie.galaxyframework.process;

import java.util.Properties;
import java.util.Set;

import com.linkgie.galaxyframework.process.ProcessDefinitionEditor.ExecutionNodeConfigurer;
import com.linkgie.galaxyframework.process.ProcessDefinitionEditor.StartingConfigurer;

/**
 * 流程运行上下文；
 * 
 * @author Hike
 *
 */
public interface ProcessContext {

	/**
	 * 流程的定义；
	 * 
	 * @return
	 */
	ProcessDefinition getDefinition();

	/**
	 * 流程实例的ID；
	 * 
	 * @return
	 */
	String getProcessId();

	/**
	 * 流程上下文的版本；
	 * <p>
	 * 
	 * 流程每执行完成一个环节之后，在该环节产生的数据构成了一个版本；
	 * <p>
	 * 
	 * 版本与流程执行步骤的顺序编号( {@link ProcessStep#getId()} )是一一对应的；
	 * 
	 * @return
	 */
	int getCurrentStepId();

	/**
	 * 当前流程的活动节点；
	 * <p>
	 * 
	 * 如果流程已经结束，则返回 null；
	 * 
	 * @return
	 */
	ExecutionNode getActivedNode();

	/**
	 * 流程的退出节点；
	 * 
	 * @return
	 */
	EndNode getEndNode();

	/**
	 * 流程的退出状态；
	 * <p>
	 * 如果流程尚未结束，则返回 null；
	 * 
	 * @return
	 */
	ExitStatus getExitStatus();

	/**
	 * 流程是否处于活跃状态；
	 * <p>
	 * 
	 * 当流程尚未结束，返回 true ；
	 * <p>
	 * 
	 * 当流程已经结束，返回 false；
	 * 
	 * @return
	 */
	boolean isActived();

	/**
	 * 属性名称列表；
	 * 
	 * @return
	 */
	Set<String> getAttributeNames();

	/**
	 * 返回属性值；
	 * <p>
	 * 
	 * 属性值来自于流程定义中的启动设置（{@link StartingConfigurer#setAttribute(String, String)}），<br>
	 * 节点的属性设置{@link ExecutionNodeConfigurer#setAttribute(String, String)}，<br>
	 * 以及启动流程实例时的设置{@link ProcessFlowEngine#start(String, Properties)}；
	 * 
	 * @param name
	 * @return
	 */
	String getAttribute(String name);

	/**
	 * 返回所有的属性值；
	 * 
	 * @return
	 */
	Properties getAttributes();

	/**
	 * 获取当前最新的数据集合；
	 * 
	 * @return
	 */
	ProcessDataset getDataset();

	/**
	 * 流程已经执行的路径；
	 * 
	 * @return
	 */
	ProcessMap getProcessMap();

}
